﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Text;
using System.Data;
using System.Text.RegularExpressions;
using System.Security.Cryptography;

namespace IDAdmin.Lib.Utils
{
    public class Converter
    {
        #region Chuyển đổi sang giá trị số

        /// <summary>
        /// Đổi sang kiểu int (trả về 0 nếu lỗi)
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static int ToInt(object value)
        {
            try
            {
                return Convert.ToInt32(Convert.ToDouble(value));
            }
            catch
            {
                return 0;
            }
        }

        /// <summary>
        /// Chuyển sang kiểu int (trả về errorValue nếu lỗi)
        /// </summary>
        /// <param name="value"></param>
        /// <param name="errorValue"></param>
        /// <returns></returns>
        public static int ToInt(object value, int errorValue)
        {
            try
            {
                return Convert.ToInt32(Convert.ToDouble(value));
            }
            catch
            {
                return errorValue;
            }
        }

        /// <summary>
        /// Chuyển sang kiểu long (trả về 0 nếu lỗi)
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static long ToLong(object value)
        {
            try
            {
                return Convert.ToInt64(Convert.ToDouble(value));
            }
            catch
            {
                return 0;
            }
        }

        /// <summary>
        /// Chuyển sang kiểu long (trả về errorValue nếu lỗi)
        /// </summary>
        /// <param name="value"></param>
        /// <param name="errorValue"></param>
        /// <returns></returns>
        public static long ToLong(object value, long errorValue)
        {
            try
            {
                return Convert.ToInt64(Convert.ToDouble(value));
            }
            catch
            {
                return errorValue;
            }
        }

        /// <summary>
        /// Chuyển sang kiểu decimal (trả về 0 nếu lỗi)
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static decimal ToDecimal(object value)
        {
            try
            {
                return Convert.ToDecimal(value);
            }
            catch
            {
                return 0;
            }
        }

        /// <summary>
        /// Chuyển sang kiểu decimal (trả về errorValue nếu lỗi)
        /// </summary>
        /// <param name="value"></param>
        /// <param name="errorValue"></param>
        /// <returns></returns>
        public static decimal ToDecimal(object value, decimal errorValue)
        {
            try
            {
                return Convert.ToDecimal(value);
            }
            catch
            {
                return errorValue;
            }
        }

        /// <summary>
        /// Chuyển sang kiểu double (trả về 0 nếu lỗi)
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static double ToDouble(object value)
        {
            try
            {
                return Convert.ToDouble(value);
            }
            catch
            {
                return 0.0;
            }
        }

        /// <summary>
        /// Chuyển sang kiểu double (trả về errorValue nếu lỗi)
        /// </summary>
        /// <param name="value"></param>
        /// <param name="errorValue"></param>
        /// <returns></returns>
        public static double ToDouble(object value, double errorValue)
        {
            try
            {
                return Convert.ToDouble(value);
            }
            catch
            {
                return errorValue;
            }
        }

        #endregion

        #region Chuyển đổi sang chuỗi

        /// <summary>
        /// Chuyển sang chuỗi (trả về "" nếu lỗi)
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static string ToString(object value)
        {
            try
            {
                return Convert.ToString(value);
            }
            catch
            {
                return "";
            }
        }

        /// <summary>
        /// Chuyển object sang chuỗi (trả về errorValue nếu lỗi)
        /// </summary>
        /// <param name="value"></param>
        /// <param name="errorValue"></param>
        /// <returns></returns>
        public static string ToString(object value, string errorValue)
        {
            try
            {
                return Convert.ToString(value);
            }
            catch
            {
                return errorValue;
            }
        }

        /// <summary>
        /// Chuyển object (DateTime) sang chuỗi ngày theo định dạng dd/MM/yyyy (trả về chuỗi rỗng nếu lỗi)
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static string ToShortDateString(object value)
        {
            try
            {
                return string.Format("{0:dd/MM/yyyy}", value);
            }
            catch
            {
                return "";
            }
        }

        /// <summary>
        /// Chuyển object (DateTime) sang chuỗi ngày theo định dạng dd/MM/yyyy (trả về errorValue nếu lỗi)
        /// </summary>
        /// <param name="value"></param>
        /// <param name="errorValue"></param>
        /// <returns></returns>
        public static string ToShortDateString(object value, string errorValue)
        {
            try
            {
                return string.Format("{0:dd/MM/yyyy}", value);
            }
            catch
            {
                return errorValue;
            }
        }

        /// <summary>
        /// Chuyển object (DateTime) sang chuỗi ngày giờ theo định dạng dd/MM/yyyy hh:mm:ss
        /// (trả về chuỗi rỗng nếu lỗi)
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static string ToLongDateString(object value)
        {
            try
            {
                return string.Format("{0:dd/MM/yyyy hh:mm:ss}", value);
            }
            catch
            {
                return "";
            }
        }

        /// <summary>
        /// Chuyển object (DateTime) sang chuỗi ngày giờ theo định dạng dd/MM/yyyy hh:mm:ss
        /// (trả về errorValue nếu lỗi)
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static string ToLongDateString(object value,string errorValue)
        {
            try
            {
                return string.Format("{0:dd/MM/yyyy hh:mm:ss}", value);
            }
            catch
            {
                return errorValue;
            }
        }

        /// <summary>
        /// Chuyển object (DateTime) sang chuỗi giờ theo định dạng hh:mm:ss
        /// (trả về chuỗi rỗng nếu lỗi)
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static string ToTimeString(object value)
        {
            try
            {
                return string.Format("{0:hh:mm:ss}", value);
            }
            catch
            {
                return "";
            }
        }

        /// <summary>
        /// Chuyển object (DateTime) sang chuỗi giờ theo định dạng hh:mm:ss
        /// (trả về chuỗi rỗng nếu lỗi)
        /// </summary>
        /// <param name="value"></param>
        /// <param name="errorValue"></param>
        /// <returns></returns>
        public static string ToTimeString(object value,string errorValue)
        {
            try
            {
                return string.Format("{0:hh:mm:ss}", value);
            }
            catch
            {
                return errorValue;
            }
        }

        public static string StripHTML(object value)
        {
            string pattern = @"<(.|\n)*?>";
            if (value == null)
                return "";
            else
             return Regex.Replace(value.ToString(), pattern, string.Empty);
        }

        public static string StripHTML(object value,int length)
        {
            string pattern = @"<(.|\n)*?>";
            string s = "";
            if (value == null)
                s = "";
            else
                s = Regex.Replace(value.ToString(), pattern, string.Empty);
            if (s.Length <= length)
                return s;
            else
                return s.Substring(0, length);
        }


        #endregion

        #region Chuyển đổi sang kiểu ngày

        /// <summary>
        /// Chuyển chuỗi có dạng dd/MM/yyyy sang giá trị kiểu ngày
        /// </summary>
        /// <param name="value"></param>
        /// <param name="errorValue"></param>
        /// <returns></returns>
        public static DateTime ToDateTime(string value, DateTime errorValue)
        {
            try
            {
                System.Globalization.CultureInfo cInfo = new System.Globalization.CultureInfo("vi-VN");
                return Convert.ToDateTime(value, cInfo);
            }
            catch
            {
                return errorValue;
            }
        }

        public static DateTime? ToNullableDateTime(object value)
        {
            try
            {
                DateTime? d = Convert.ToDateTime(value);
                if (d < new DateTime(1900,1,1) || d > new DateTime(9999,12,31))
                    d = null;
                return d;
            }
            catch
            {
                return null;
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="day"></param>
        /// <param name="month"></param>
        /// <param name="year"></param>
        /// <returns></returns>
        public static DateTime? ToNullableDateTime(int day, int month, int year)
        {
            try
            {
                return new DateTime(year, month, day);
            }
            catch
            {
                return null;
            }
        }

        /// <summary>
        /// Chuyển chuỗi theo định dạng dd/MM/yyyy sang giá trị kiểu ngày
        /// (hàm trả về null nếu chuỗi value không hợp lệ)
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static DateTime? ToNullableDateTime(string value)
        {
            try
            {
                System.Globalization.CultureInfo cInfo = new System.Globalization.CultureInfo("vi-VN");
                DateTime? d = Convert.ToDateTime(value, cInfo);
                if (d < new DateTime(1900, 1, 1) || d > new DateTime(9999, 12, 31))
                    d = null;
                return d;
            }
            catch
            {
                return null;
            }
        }

        public static long ToUnixTimestamp(DateTime value)
        {
            try
            {
                TimeSpan span = (value - new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime());
                return (long)span.TotalSeconds;
            }
            catch
            {
                return 0;
            }
        } 

        #endregion

        #region Khác

        /// <summary>
        /// Chuyển sang kiểu bool (trả về false nếu lỗi)
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static bool ToBoolean(object value)
        {
            try
            {
                return Convert.ToBoolean(value);
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// Convert sang bool (trả về errorValue nếu lỗi)
        /// </summary>
        /// <param name="value"></param>
        /// <param name="errorValue"></param>
        /// <returns></returns>
        public static bool ToBoolean(object value, bool errorValue)
        {
            try
            {
                return Convert.ToBoolean(value);
            }
            catch
            {
                return errorValue;
            }
        }

        #endregion
    }
}
